%% 综合评价与决策方法Comprehensive evaluation and decision method
%% 1.理想解法Ideal solution
% 评价方法大体上可分为两类，其主要区别在于确定权重的方法。一类是主观赋权法，
% 如综合指数法、模糊综合评价法、层次分析法、功效系数法等；另一类是客观赋权法
% 根据各指标间相关关系或各指标值变异程度来确定权数，如主成分分析、因子分析、
% 理想解(TOPSIS法)等。
% 理想解法通过衡量各方案到理想解的距离对各方案进行排名，确定方案的优劣。
% 现通过实例来说明理想解法过程。
clear,clc
load data.mat % 该数据为3126天内6项空气指标数据，空气指标均为成本型数据
% (成本型指数据越小越好，效益型恰好相反，区间型在特定值较好)
shuju1=shuju(1:300,:);% 取前300天数据，进行评价
% 数据预处理
[num0,num1]=size(shuju1);
shuju2=zeros(num0,num1);
for i=1:num1 % 构造规范化决策矩阵
    shuju2(:,i)=shuju1(:,i)./sqrt(sum(shuju1(:,i).^2));
end
w=ones(1,num1);% 由决策人给定个属性权重向量
shuju3=zeros(num0,num1);
for i=1:num1 % 构造加权规范阵
    shuju3(:,i)=w(i)*shuju2(:,i);
end
% 计算各方案到正理想解和负理想解的距离，最终得到各方案综合评价指数。
cm=zeros(1,num1);% 正理想解
for i=1:num1
    cm(i)=min(shuju3(:,i));
end
c0=zeros(1,num1);% 负理想解
for i=1:num1
    c0(i)=max(shuju3(:,i));
end
f=zeros(num0,1);% 计算综合评价指数，越大越好
for i=1:num0
    f(i)=norm(shuju3(i,:)-c0)/(norm(shuju3(i,:)-c0)+norm(shuju3(i,:)-cm));
end
%% 2.模糊综合评价法Fuzzy comprehensive evaluation method
% 以模糊数学为基础，应用模糊关系合成原理，将一些边界不清，不易定量的因素定量
% 化，从多个因素对被评价事物隶属等级状况进行综合评价。具体步骤为：
% (1)确定被评价对象的因素集和评价集；(2)确定各因素的权重及他们的隶属度向量，
% 获得模糊评价矩阵；(3)将模糊评价矩阵与因素的权向量进行模糊综合运算并归一化，
% 从而得到模糊评价综合结果。
clear,clc
% 现通过模糊综合评价确定一表演的成绩
U={{'难度'},{'观赏性'},{'灵活性'},{'主题契合度'},{'发展深度'}};% 评价指标
V={{'A+'},{'A'},{'A-'},{'B+'},{'B'},{'B-'},{'C'},{'D'}};% 评价等级
% 构建模糊综合评价矩阵
ruv=[0.6,0.4,0.2,0.1,0,0,0,0;0.1,0.1,0.3,0.3,0.3,0.2,0,0
    0.4,0.4,0.4,0.3,0.3,0.2,0.1,0.1;0.1,0.1,0.1,0.2,0.4,0.6,0.3,0.2
    0.3,0.3,0.4,0.5,0.4,0.3,0.2,0.1];% i*j矩阵，确定第i个指标在第j各评价等级
% 上的隶属度
[num0,num1]=size(ruv);
for i=1:num1
    ruv(:,i)=ruv(:,i)/sum(ruv(:,i));
end
% 确定评价指标权重
a=[3,4,4,3,3];% 权重向量
a=a/sum(a);% 使权重向量元素之和为1
% 也可以使用变异系数法定权，变异系数法会将隶属度变化范围大的指标赋予较大权重
a1=zeros(1,num0);
for i=1:num0
    a1(i)=std(ruv(i,:))^2/abs(mean(ruv(i,:)));
end
a1=a1/sum(a1);
% 对权重向量和隶属度矩阵做模糊合成
operator={{'zadeh'},{'主因素决定型'},{'先取小再求和'},{'先相乘再取大'},...
    {'先相乘再求和'}};% 模糊合成算子类型
operator0=1;% 选择算子类型
r1=zeros(num0,num1);
switch operator0
    case 1
        for i=1:num1
            r1(:,i)=max([ruv(:,i),a'],[],2);
        end
        B=min(r1);
    case 2
        for i=1:num1
            r1(:,i)=min([ruv(:,i),a'],[],2);
        end
        B=max(r1);
    case 3
        for i=1:num1
            r1(:,i)=min([ruv(:,i),a'],[],2);
        end
        B=sum(r1);
    case 4
        for i=1:num1
            r1(:,i)=ruv(:,i).*a';
        end
        B=max(r1);
    case 5
        for i=1:num1
            r1(:,i)=ruv(:,i).*a';
        end
        B=sum(r1);
end
% 对B进行处理后即可得到该表演的评价，一般方法有最大隶属度法，加权平均法
%% 3.数据包络分析Data envelopment analysis
% 数据包络分析是评价具有多指标输入和多指标输出系统的较为有效的方法。下方通过
% 案例进行数据包络分析。
clear,clc
Invest={{'生均投入'},{'家庭收入'}};% 此指标为投入指标
Output={{'生均写作得分'},{'生均科技得分'}};% 此指标为输出指标
rio=[89.39,86.25,108.13,106.38,62.4,47.19;64.3,99,99.6,96,96.2,79.9
    25.2,28.2,29.4,26.4,27.2,25.2;223,287,317,291,295,222];% 该数据为6所学校
% 在两类指标上的数据
a=rio([1,2],:)';b=rio([3,4],:)';% 分别提取出投入指标和输出指标
prob=optimproblem('ObjectiveSense','max');
u=optimvar('u',2,'LowerBound',0);
v=optimvar('v',2,'LowerBound',0);
prob.Constraints.con1=a*u>=b*v;
result=[];
for j=1:6
    prob.Objective=b(j,:)*v;
    prob.Constraints.con2=a(j,:)*u==1;
    [sol,fval]=solve(prob);
    su=sol.u;sv=sol.v;
    result=[result,fval,su',sv'];
end
% 数据包络分析有效，实际是指评价对象的投入产出比是否能达到最大，因此fval结果
% 越接近1，该方案投入产出比越有效果。
%% 4.灰色关联分析法Grey correlation analysis
% 本节通过案例进行灰色关联度分析。
clear,clc
% 某核心企业需要在6个待选的零部件供应商中选择一则合作伙伴，有如下评价指标：
Index={{'产品质量'},{'产品价格/元'},{'地理位置/km'},{'售后服务/h'},...
    {'技术水平'},{'经济效益'},{'供应能力/件'},{'市场影响度'},{'交货情况'}};
% 其中产品质量，技术水平，经济效益，供应能力，市场影响度交货情况指标属于效益
% 型指标；产品价格，地理位置，售后服务指标属于成本型指标。有数据如下：
a=[0.83,0.9,0.99,0.92,0.87,0.95;326,295,340,287,310,303
    21,38,25,19,27,10;3.2,2.4,2.2,2,0.9,1.7;0.2,0.25,0.12,0.33,0.2,0.09
    0.15,0.2,0.14,0.09,0.15,0.17;250,180,300,200,150,175
    0.23,0.15,0.27,0.3,0.18,0.26;0.87,0.95,0.99,0.89,0.82,0.94];
% 对效益型指标和成本型指标分布规范化为0-1效益型指标：
for i=[1,5:9]
    a(i,:)=(a(i,:)-min(a(i,:)))/(max(a(i,:))-min(a(i,:)));
end
for i=2:4
    a(i,:)=(max(a(i,:))-a(i,:))/(max(a(i,:))-min(a(i,:)));
end
[m,n]=size(a);
ck=max(a,[],2);% 逐行求最大值，得到参考数列
t=ck-a;% 求参考数列与每一个比较数列的差
mmin=min(min(t));% 计算最小差
mmax=max(max(t));% 计算最大差
rho=0.5;% 分辨系数
xishu=(mmin+rho*mmax)./(t+rho*mmax);% 计算灰色关联系数
guanliandu=mean(xishu);% 取等权重，计算关联度
[gsort,ind]=sort(guanliandu,'descend');% 对关联度从大到小排序
%% 5.秩和比综合评价法Rank-sum ratio comprehensive evaluation method
% 秩和比综合评价法基本原理是在一个n行m列矩阵中，通过秩转换，获得无量纲统计量
% RSR；以RSR值对评价对象的优劣直接排序或分档排序，从而对评价对象做出综合评价。
% 本节通过实例说明秩和比综合评价法步骤。
clear,clc
load data.mat % 该数据为3126天内6项空气指标数据
shuju1=shuju(1:300,:);% 取前300天数据，进行评价
[num0,num1]=size(shuju1);
ra=tiedrank(shuju1);% 对数据每项指标编秩
w=ones(1,num1);w=w/sum(w);% 权重向量
WRSR=sum(ra.*w,2)/num0;% 计算加权秩和比
[sWRSR,ind]=sort(WRSR,'descend');% 对加权秩和比排序
%% 6.基于熵权法的评价方法Evaluation method based on entropy weight method
% 熵权法是一种客观定权方法，熵权法根据各指标变异程度，利用信息熵计算出各指标
% 的熵权，从而得到较为客观的指标权重。本节通过实例说明熵权法法评价步骤。
clear,clc
load data.mat % 该数据为3126天内6项空气指标数据
shuju1=shuju(1:300,:);% 取前300天数据，进行评价
[num0,num1]=size(shuju1);
p=shuju1./sum(shuju1);
e=-sum(p.*log(p))/log(num0);
g=1-e;w=g/sum(g);% 计算权重
s=w*p';% 计算各个评价对象的综合评价值
[ss,ind1]=sort(s,'descend');% 对评价值从大到小排序
%% 7.PageRank算法PageRank algorithm
% PageRank算法是Google搜索引擎对检索结果的一种排序算法，它借鉴了传统引文分析
% 思想：当网页甲有一个链接指向网页乙时，认为乙获得了甲对它贡献的分值，该值的
% 多少取决于网页中甲本身的重要程度，即网页甲的重要性越大，网页乙获得的贡献值
% 就越高，由于网络中网页链接的相互指向，因此该分值的计算为一个迭代过程，最终
% 网页根据所得分值进行检索排序。
clear,clc
N=6;
B=[0,1,0,0,0,0;0,0,1,1,0,0;0,0,0,1,1,1;1,0,0,0,0,0;0,0,0,0,0,1;1,0,0,0,0,0];
% 网页转移矩阵，有6个网页，当某两个网页相互连接时为1，否则为0
r=sum(B,2);% 计算行和，即每个网页链接数目
d=0.85;% 参数
A=(1-d)/N+d*B./r;% 计算转移概率矩阵
[x,y]=eigs(A',1);% 求最大特征值对应的特征向量
x=x/sum(x);% 特征向量归一化